ديف أوبس

نشر تطبيق PHP باستخدام Ansible

نشر تطبيق PHP باستخدام Ansible، DevOps، نشر تلقائي، إدارة السيرفرات، التشغيل الآلي

يُعد نشر تطبيقات PHP على الخوادم إحدى المهام الأساسية في دورة حياة تطوير البرمجيات، خصوصاً عندما يتم تطوير التطبيقات على بيئات محلية ويجب نشرها إلى خوادم الإنتاج أو بيئات الاختبار. مع تطور ممارسات DevOps واعتماد التشغيل الآلي بشكل واسع، أصبحت أدوات مثل Ansible حلاً فعالاً لتبسيط عمليات النشر، تحسين الاتساق، تقليل الأخطاء البشرية، وتسريع دورة النشر.

Ansible هو نظام مفتوح المصدر لإدارة التهيئة والتشغيل الآلي، يعتمد على ملفات YAML لكتابة “playbooks” تنفذ سلسلة من المهام على خوادم متعددة. في سياق نشر تطبيق PHP، يمكن لـ Ansible التعامل مع إعداد الخادم، تثبيت الحزم المطلوبة، نسخ ملفات المشروع، تهيئة إعدادات قاعدة البيانات، وضبط إعدادات الخادم مثل Apache أو Nginx، بالإضافة إلى التحكم في إعادة تشغيل الخدمات.

أهمية استخدام Ansible لنشر تطبيقات PHP

يتميز Ansible بعدد من الخصائص التي تجعله ملائماً جداً لعمليات النشر:

  • بلا وكيل (Agentless): لا يحتاج إلى تثبيت أي برنامج على الخوادم المُدارة، فهو يعتمد على SSH لتنفيذ الأوامر.

  • قابلية التكرار: يمكن تنفيذ نفس Playbook على عدة خوادم بنتائج متسقة.

  • سهولة القراءة والكتابة: يستخدم لغة YAML البسيطة لكتابة الأوامر، مما يجعله مفهوماً حتى للمطورين غير المتخصصين في DevOps.

  • قابلية التوسعة: يمكن استخدامه في بيئات صغيرة أو كبيرة، من خادم واحد إلى مئات الخوادم.

المتطلبات الأساسية

لنشر تطبيق PHP باستخدام Ansible، هناك متطلبات أولية يجب توفرها:

  • خادم/خوادم الوجهة (مثلاً Ubuntu أو CentOS).

  • خادم التحكم (عادةً جهاز محلي أو خادم CI/CD).

  • وصول SSH إلى الخوادم باستخدام مفتاح خاص.

  • ملف inventory يحدد الخوادم المستهدفة.

  • ملفات playbook مكتوبة بلغة YAML.

  • هيكل مشروع PHP جاهز للنشر.

  • إعدادات لخادم الويب مثل Apache أو Nginx، وPHP-FPM إن لزم.

بنية ملف Ansible Inventory

ملف الـ inventory يحتوي على قائمة الخوادم التي سيتم تنفيذ المهام عليها، ويمكن تقسيمها إلى مجموعات مثل webservers أو dbservers. مثال على ملف inventory:

ini
[webservers] 192.168.1.10 ansible_user=ubuntu ansible_ssh_private_key_file=~/.ssh/id_rsa [dbservers] 192.168.1.11 ansible_user=ubuntu ansible_ssh_private_key_file=~/.ssh/id_rsa

إعداد Playbook لنشر تطبيق PHP

1. إنشاء هيكل المشروع

bash
php-deployment/ ├── inventory ├── deploy.yml ├── roles/ │ └── php/ │ ├── tasks/ │ │ └── main.yml │ └── templates/ │ └── virtualhost.conf.j2 ├── files/ │ └── app/ │ └── index.php

2. تثبيت البرامج المطلوبة

في ملف roles/php/tasks/main.yml يمكن كتابة ما يلي لتثبيت Apache وPHP:

yaml
--- - name: تحديث الحزم apt: update_cache: yes - name: تثبيت Apache وPHP apt: name: - apache2 - php - libapache2-mod-php - php-mysql state: present

3. رفع ملفات تطبيق PHP

yaml
- name: نسخ ملفات تطبيق PHP copy: src: files/app/ dest: /var/www/html/ owner: www-data group: www-data mode: '0755'

4. تهيئة إعدادات Apache

yaml
- name: نسخ إعدادات VirtualHost template: src: virtualhost.conf.j2 dest: /etc/apache2/sites-available/000-default.conf - name: إعادة تشغيل Apache service: name: apache2 state: restarted

5. محتوى قالب Apache

في ملف templates/virtualhost.conf.j2:

apache
DocumentRoot /var/www/html AllowOverride All Require all granted ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined

6. ملف deploy.yml الرئيسي

yaml
--- - name: نشر تطبيق PHP hosts: webservers become: yes roles: - php

إدارة قواعد البيانات

يمكن لـ Ansible إدارة إعدادات قواعد البيانات أيضاً، مثل MySQL، عبر دور (roles) متخصصة. على سبيل المثال:

yaml
- name: تثبيت MySQL apt: name: mysql-server state: present - name: إنشاء قاعدة بيانات mysql_db: name: myapp_db state: present - name: إنشاء مستخدم لقاعدة البيانات mysql_user: name: myuser password: mypassword priv: 'myapp_db.*:ALL' state: present

تضمين خطوات اختبار بعد النشر

يمكن تضمين مهام تحقق مثل التأكد من أن الخدمة تعمل:

yaml
- name: التحقق من استجابة السيرفر uri: url: http://localhost status_code: 200

نشر تلقائي مستمر باستخدام Git وAnsible

يمكن دمج Ansible مع أنظمة CI/CD مثل GitLab CI أو Jenkins لتنفيذ Playbooks تلقائياً عند كل عملية دفع (push) إلى المستودع. مثال على ملف .gitlab-ci.yml:

yaml
deploy: stage: deploy script: - ansible-playbook -i inventory deploy.yml

مقارنة بين الطرق التقليدية وAnsible

العنصر الطريقة التقليدية باستخدام Ansible
سرعة النشر بطيئة وتحتاج لتدخل يدوي تلقائية وسريعة
قابلية التكرار منخفضة عالية
معدل الأخطاء مرتفع بسبب التفاعل اليدوي منخفض بفضل التشغيل الآلي
التوسع على عدة خوادم صعب ومعقد سهل عبر ملف inventory
التكامل مع أدوات CI/CD غير متوفر غالباً متاح وسهل

تحسين الأمان في عمليات النشر

يمكن تعزيز أمان النشر من خلال:

  • استخدام SSH بمفاتيح خاصة فقط.

  • تقييد صلاحيات مستخدم Ansible.

  • تخزين كلمات المرور باستخدام Ansible Vault.

  • فصل ملفات التهيئة الحساسة وعدم رفعها ضمن ملفات التطبيق.

إدارة الإصدارات واستعادة الحالة السابقة

يمكن بناء مهام rollback داخل Playbook بحيث يتم التراجع عن أي إصدار لم يعمل بشكل صحيح. يتضمن ذلك الاحتفاظ بنسخ احتياطية من ملفات التطبيق قبل الكتابة عليها، مثل:

yaml
- name: نسخ نسخة احتياطية من التطبيق السابق command: cp -r /var/www/html /var/www/html_backup_{{ ansible_date_time.iso8601 }}

التعامل مع البيئة المحلية وبيئات الاختبار

يمكن إنشاء ملفات inventory متعددة حسب البيئة:

bash
inventories/ ├── production ├── staging ├── development

كل ملف يحتوي على إعدادات البيئة الخاصة به، ويمكن تحديده أثناء تنفيذ Playbook:

bash
ansible-playbook -i inventories/production deploy.yml

استخدام المتغيرات لتخصيص Playbooks

يمكن تعريف متغيرات مرنة لتخصيص النشر، مثل:

yaml
vars: app_root: /var/www/html php_version: "8.1"

ويمكن تمريرها أيضاً من سطر الأوامر:

bash
ansible-playbook deploy.yml -e "php_version=8.2"

دمج Ansible مع Git وDocker

في بعض المشاريع الحديثة، يتم نشر تطبيق PHP داخل حاويات Docker. يمكن لـ Ansible أن يدير عملية بناء الصور، تشغيل الحاويات، تحديثها، وربطها بشبكات خارجية.

yaml
- name: تشغيل حاوية PHP docker_container: name: php-app image: myrepo/php:latest state: started ports: - "80:80"

ممارسات جيدة في كتابة Playbooks

  • تجنب التكرار عبر استخدام الأدوار (roles).

  • فصل المهام حسب الوظيفة (تثبيت – نسخ – تكوين – إعادة تشغيل).

  • تسمية المهام بوضوح لتسهيل تتبع النتائج.

  • اختبار كل مرحلة في بيئة اختبار قبل تطبيقها على الإنتاج.

  • الاحتفاظ بسجلات التشغيل --log-path.

الخاتمة الفنية

استخدام Ansible في نشر تطبيقات PHP يُحدث تحولاً كبيراً في طريقة التعامل مع الخوادم، سواء على مستوى البنية التحتية أو على مستوى سرعة النشر. بفضل البساطة والقوة التي توفرها Ansible، يمكن ضمان نشر متسق، موثوق، وآمن للتطبيقات مع تقليل التكاليف التشغيلية. كما أن إمكانياته في التوسع والتكامل مع أدوات DevOps الأخرى تجعله خياراً مثالياً لمشاريع الويب الحديثة.

المصادر